package com.hb.commons;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 响应对象实体类
 *
 * @author zhaojk
 * @version 2.0
 */
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class ResponseDto implements Cloneable {
    /**
     * 响应是否成功返回标识
     * 只要接口成功响应, 该字段始终为true
     */
    private boolean success;
    /**
     * 状态码, 在枚举中统一定义, 前后端一定要勾搭好 !
     * @see MsgEnum
     */
    private int status;
    /**
     * 响应消息
     * 后端返回的消息
     */
    private String message;
    /**
     * 数据结果集
     */
    private Object data;
    /**
     * 额外属性
     */
    private JSONObject attrs;

    public ResponseDto put(String key, Object value) {
        if (this.attrs == null) {
            attrs = JSONUtil.createObj();
        }
        this.attrs.putOpt(key, value);
        return this;
    }

    public Object get(String key) {
        if (this.attrs == null) {
            return null;
        }
        return this.attrs.get(key);
    }

    /**
     * 该方法有可能会引起异常抛出
     * 注意实际类型的对应
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getRealData(Class<T> clazz) {
        return BeanUtil.copyProperties(this.data, clazz);
    }

    /**
     * 使用原型模式获取对象实例
     *
     * @return
     */
    public ResponseDto getInstance() {
        try {
            return (ResponseDto) this.clone();
        } catch (CloneNotSupportedException ignored) {
        }
        return new ResponseDto();
    }

    @Override
    public String toString() {
        return JSONUtil.toJsonStr(this);
    }
}
